package com.maochd.platform.domain;

import lombok.Data;

import java.io.Serializable;

/**
 * 通用响应实体类
 *
 * @param <T> 响应数据类型
 */
@Data
public class R<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 响应码
     */
    private Integer code;

    /**
     * 业务码
     */
    private String bizCode;

    /**
     * 响应消息
     */
    private String msg;

    /**
     * 业务消息
     */
    private String bizMsg;

    /**
     * 响应数据
     */
    private T data;

    /**
     * 判断响应是否成功
     *
     * @param r 响应实体
     * @return 是否成功
     */
    public static Boolean isOk(R<?> r) {
        return r != null && r.getCode() == 200;
    }

    /**
     * 判断响应是否失败
     *
     * @param r 响应实体
     * @return 是否失败
     */
    public static Boolean isNotOk(R<?> r) {
        return !isOk(r);
    }

    /**
     * 创建成功响应
     *
     * @return 响应实体
     */
    public static <T> R<T> ok() {
        return restResult(null, 200, "操作成功", "200", "成功");
    }

    /**
     * 创建带数据的成功响应
     *
     * @param data 响应数据
     * @return 响应实体
     */
    public static <T> R<T> ok(T data) {
        return restResult(data, 200, null, "200", "成功");
    }

    /**
     * 创建带数据和消息的成功响应
     *
     * @param data 响应数据
     * @param msg  响应消息
     * @return 响应实体
     */
    public static <T> R<T> ok(T data, String msg) {
        return restResult(data, 200, msg, "200", "成功");
    }

    /**
     * 创建失败响应
     *
     * @return 响应实体
     */
    public static <T> R<T> fail() {
        return restResult(null, 500, "操作失败", "500", "对不起，出错了");
    }

    /**
     * 创建带消息的失败响应
     *
     * @param msg 响应消息
     * @return 响应实体
     */
    public static <T> R<T> fail(String msg) {
        return restResult(null, 500, msg, "500", "对不起，出错了");
    }

    /**
     * 创建带数据的失败响应
     *
     * @param data 响应数据
     * @return 响应实体
     */
    public static <T> R<T> fail(T data) {
        return restResult(data, 500, "操作失败", "500", "对不起，出错了");
    }

    /**
     * 创建带数据和消息的失败响应
     *
     * @param data 响应数据
     * @param msg  响应消息
     * @return 响应实体
     */
    public static <T> R<T> fail(T data, String msg) {
        return restResult(data, 500, msg, "500", "对不起，出错了");
    }

    /**
     * 创建带状态码和消息的失败响应
     *
     * @param code 状态码
     * @param msg  响应消息
     * @return 响应实体
     */
    public static <T> R<T> fail(int code, String msg) {
        return restResult(null, code, msg, "500", "对不起，出错了");
    }

    /**
     * 创建响应实体
     *
     * @param data    响应数据
     * @param code    状态码
     * @param msg     响应消息
     * @param bizCode 业务码
     * @param bizMsg  业务消息
     * @return 响应实体
     */
    private static <T> R<T> restResult(T data, int code, String msg, String bizCode, String bizMsg) {
        R<T> apiResult = new R<>();
        apiResult.setCode(code);
        apiResult.setData(data);
        apiResult.setMsg(msg);
        apiResult.setBizCode(bizCode);
        apiResult.setBizMsg(bizMsg);
        return apiResult;
    }
}
